home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / progjour / 1990 / 05 / wvideo.asm < prev    next >
Assembly Source File  |  1990-08-06  |  3KB  |  143 lines

  1.     title    wvideo - video interface for window system
  2.     include    window.inc
  3.     include    asm.inc
  4.  
  5. ; (c) 1990 Soft Advances, all rights reserved.
  6.                                                
  7.         public row_count,column_count
  8.  
  9.     .data?
  10. video_pointer    label    dword
  11. video_offset    dw    ?
  12. video_segment    dw    ?
  13.  
  14. row_count    db    ?
  15. column_count    db    ?
  16.  
  17.  
  18.     .code
  19.     public    write_video_memory,video_preset
  20.  
  21.  
  22. ;;    convert pixel value
  23. ;
  24. ;    entry    AX    pixel color value
  25. ;    exit    AL    attribute
  26. ;
  27. convert_pixel_value proc
  28.     cmp    ax,BLACK_PIXEL
  29.     jne    cpv1
  30.     mov    al,70h
  31.     ret
  32. cpv1:    cmp    ax,WHITE_PIXEL
  33. ;    jne
  34.     mov    al,07h
  35.     ret
  36. convert_pixel_value endp
  37.  
  38.  
  39. ;;    get row count
  40. ;
  41. ;    exit    AL    number of display rows
  42. ;
  43. get_row_count proc
  44.     push    ds            ; access row count (minus 1) from BIOS
  45.     mov    ax,40h            ;  data area (0040:0084).
  46.     mov    ds,ax
  47.     mov    al,ds:[84h]        ;  (an old BIOS might have 0 here)
  48.     inc    al
  49.     cmp    al,25
  50.     jne    grc1            ;  if more than 25 rows
  51.     mov    al,25            ;  else assume 25 rows
  52. grc1:    pop    ds
  53.     ret
  54. get_row_count endp
  55.  
  56.  
  57. ;;    video io
  58. ;
  59. ;    entry    AX,BX,CX,DX see INT10 documentation
  60. ;    exit    AX,BX,CX,DX see INT10 documentation
  61. ;        Cf    0
  62. ;
  63. video_io proc
  64.     push    bp
  65.     int    10h
  66.     pop    bp
  67.     clc
  68.     ret
  69. video_io endp
  70.  
  71.  
  72. ;;    video preset
  73. ;
  74. ;    may use    AX,BX,CX,DX,DI,SI,DS,ES
  75. ;
  76. video_preset proc
  77.     call    get_row_count        ; set row count
  78.     mov    row_count[bp],al
  79.  
  80.     mov    ah,15            ; set column count
  81.     call    video_io
  82.     mov    column_count[bp],ah
  83.  
  84.     and    al,7Fh
  85.     cmp    al,7            ; use video mode to find video buffer
  86.     mov    cx,0B800h
  87.     jb    vps1            ;  if CGA mode
  88.     mov    cx,0B000h
  89.     je    vps1            ;  if mono mode
  90.     mov    cx,0A000h        ;  else EGA/VGA
  91. vps1:    mov    video_segment[bp],cx
  92.     ret
  93. video_preset endp
  94.  
  95.  
  96. ;;    write video memory
  97. ;
  98. ;    entry    AX    attribute
  99. ;        CX    byte count
  100. ;        DL    column
  101. ;        DH    row
  102. ;        DS:SI    text pointer
  103. ;    may use    AX,BX,CX,DX,SI,DS,ES    (not DI)
  104. ;
  105. write_video_memory proc
  106.     push    di
  107.     call    convert_pixel_value
  108.     mov    bx,ax
  109.  
  110.     jcxz    wvm3            ;  if empty write
  111.     cmp    dh,row_count[bp]
  112.     jae    wvm3            ;  if below display
  113.     mov    al,column_count[bp]
  114.     sub    al,dl
  115.     jbe    wvm3            ;  if right of display
  116.  
  117.     mov    ah,0            ; verify that text fits on display
  118.     cmp    cx,ax
  119.     ja    wvm4            ;  if too many bytes
  120.  
  121. wvm1:    mov    al,dh            ; compute video memory address
  122.     mul    column_count[bp]
  123.     mov    dh,0
  124.     add    ax,dx
  125.     add    ax,ax
  126.     les    di,video_pointer[bp]
  127.     add    di,ax
  128.     mov    ah,bl
  129.  
  130.     even
  131. wvm2:    lodsb                ; copy string to video memory
  132.     stosw
  133.     loop    wvm2
  134. wvm3:    pop    di
  135.     ret
  136.  
  137. wvm4:    mov    cx,ax            ; reduce byte count to fit on screen
  138.     jmp    wvm1
  139. write_video_memory endp
  140.  
  141.  
  142.     end
  143.